package br.com.locasis.funcionalidades;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.international.StatusMessage.Severity;
import org.jboss.seam.international.StatusMessages;

import br.com.locasis.entity.Funcionalidade;
import br.com.locasis.entity.Perfil;
import br.com.locasis.entity.PerfilFuncionalidade;

@Name("cadastrarPerfil")
@Scope(ScopeType.CONVERSATION)
//@Restrict(value="#{identity.hasRole('"+PerfilUsuario.PERFIL_PETSHOP+"')}")
public class CadastrarPerfil {
	
	@In(create=true)
	private EntityManager entityManager;
	
	@In(value = "statusMessages")
	protected StatusMessages messages;
	
	private Perfil perfilEdicao;
	
	private List<Perfil> listaPerfis;
	
	private List<SelectItem> listaPerfisAutorizacao;
	
	@Out(required=false)
	private Perfil perfilSelecionado;
	
	private boolean selecionadoTodos;
	
	private List<PerfilFuncionalidade> listaPerfisFuncionalidade;
	
	private List<SelectItem> listaFuncionalidades;
	
	private Integer idPerfilSelecionado;

	public boolean isSelecionadoTodos() {
		return selecionadoTodos;
	}

	public void setSelecionadoTodos(boolean selecionadoTodos) {
		this.selecionadoTodos = selecionadoTodos;
	}
	
	public Integer getIdPerfilSelecionado() {
		return idPerfilSelecionado;
	}

	public void setIdPerfilSelecionado(Integer idPerfilSelecionado) {
		this.idPerfilSelecionado = idPerfilSelecionado;
	}

	public void selecionaTodos(){
		for(Perfil a : getListaPerfis()){
			if(isSelecionadoTodos()){
				a.setSelecionado(true);
			}else{
				a.setSelecionado(false);
			}
		}
	}

	@SuppressWarnings("unchecked")
	public void onLoad(){
		setListaPerfis(null);
		if(perfilSelecionado != null){
			perfilEdicao = perfilSelecionado;
			listaPerfisFuncionalidade = entityManager.createQuery("select pf from PerfilFuncionalidade pf where pf.perfil.idPerfil = :idPerfil")
				.setParameter("idPerfil", perfilSelecionado.getIdPerfil())
				.getResultList();
			for(PerfilFuncionalidade pf : listaPerfisFuncionalidade){
				pf.setIdFuncionalidadeSelecionada(pf.getFuncionalidade().getIdFuncionalidade());
			}
		}
	}
	
	public void onLoadList(){
		setPerfilEdicao(null);
		perfilSelecionado = null;
		setListaPerfisFuncionalidade(null);
	}

	public String salvar(){
		// FIXME - ESTILO ANTIGO DE IMPLEMENTACAO
		// if (getPerfilEdicao().getVlrMaxDesconto() != null && getPerfilEdicao().getVlrMaxDesconto() > 0) {
		if (getPerfilEdicao().getVlrMaxDesconto() != null && getPerfilEdicao().getVlrMaxDesconto().intValue() > 0) {
			if (getIdPerfilSelecionado() == null) {
				messages.add(Severity.INFO, "O campo 'Perfil autorizador do desconto' é de preenchimento obrigatório.");
				return null;
			}
		}
		getPerfilEdicao().setFlgAtivo(true);
		getPerfilEdicao().setPerfilAutorizacao(getIdPerfilSelecionado() != null ? entityManager.find(Perfil.class, getIdPerfilSelecionado()) : null);
		Perfil perfilSalvo = entityManager.merge(getPerfilEdicao());
		for(PerfilFuncionalidade pf : getListaPerfisFuncionalidade()){
			pf.setFuncionalidade(entityManager.find(Funcionalidade.class, pf.getIdFuncionalidadeSelecionada()));
			if(pf.isControleTotal()){
				pf.setFlgExclusao(true);
				pf.setFlgGravacao(true);
				pf.setFlgLeitura(true);
			}
			pf.setPerfil(perfilSalvo);
			entityManager.merge(pf);
		}
		entityManager.flush();
		messages.add(Severity.INFO,"Perfil cadastrado com sucesso.");
		setPerfilEdicao(null);
		return "persisted";
	}
	
	public String cancelar(){
		setPerfilEdicao(null);
		return "voltar";
	}
	
	public void excluir(){
		List<Perfil> listaRemocao = new ArrayList<Perfil>();
		for(Perfil a : getListaPerfis()){
			if(a.isSelecionado()){
				a.setFlgAtivo(false);
				entityManager.merge(a);
				listaRemocao.add(a);
			}
		}
		getListaPerfis().removeAll(listaRemocao);
		entityManager.flush();
		messages.add(Severity.INFO,"Perfil(is) excluído(s) com sucesso.");
	}
	
	public String novo(){
		return "novo";
	}
	
	public String editar(Perfil perfil){
		perfilSelecionado = perfil;
		setIdPerfilSelecionado(perfil.getPerfilAutorizacao() != null ? perfil.getPerfilAutorizacao().getIdPerfil() : null);
		return "editar";
	}

	public void novaFuncionalidade(){
		getListaPerfisFuncionalidade().add(new PerfilFuncionalidade());
	}
	
	public void excluirFuncionalidade(){
		List<PerfilFuncionalidade> listaRemocao = new ArrayList<PerfilFuncionalidade>();
		for(PerfilFuncionalidade pf : getListaPerfisFuncionalidade()){
			if(pf.isSelecionado()){
				listaRemocao.add(pf);
				if(pf.getIdPerfilFuncionalidade() != null){
					entityManager.remove(pf);
					entityManager.flush();
				}
			}
		}
		getListaPerfisFuncionalidade().removeAll(listaRemocao);
	}

	public Perfil getPerfilEdicao() {
		if (perfilEdicao == null) {
			perfilEdicao = new Perfil();
		}
		return perfilEdicao;
	}

	public void setPerfilEdicao(Perfil perfilEdicao) {
		this.perfilEdicao = perfilEdicao;
	}

	@SuppressWarnings("unchecked")
	public List<Perfil> getListaPerfis() {
		if (listaPerfis == null) {
			listaPerfis = entityManager.createQuery("select p from Perfil p where p.flgAtivo is true").getResultList();
		}
		return listaPerfis;
	}

	public void setListaPerfis(List<Perfil> listaPerfis) {
		this.listaPerfis = listaPerfis;
	}

	@SuppressWarnings("unchecked")
	public List<SelectItem> getListaPerfisAutorizacao() {
		if (listaPerfisAutorizacao == null) {
			listaPerfisAutorizacao = new ArrayList<SelectItem>();
			listaPerfisAutorizacao.add(new SelectItem(null,"Selecione"));
			List<Perfil> lista = entityManager.createQuery("select p from Perfil p where p.flgAtivo is true").getResultList();
			for(Perfil p : lista){
				listaPerfisAutorizacao.add(new SelectItem(p.getIdPerfil(),p.getNome()));
			}
		}
		return listaPerfisAutorizacao;
	}

	public void setListaPerfisAutorizacao(List<SelectItem> listaPerfisAutorizacao) {
		this.listaPerfisAutorizacao = listaPerfisAutorizacao;
	}

	public List<PerfilFuncionalidade> getListaPerfisFuncionalidade() {
		if (listaPerfisFuncionalidade == null) {
			listaPerfisFuncionalidade = new ArrayList<PerfilFuncionalidade>();
		}
		return listaPerfisFuncionalidade;
	}

	public void setListaPerfisFuncionalidade(
			List<PerfilFuncionalidade> listaPerfisFuncionalidade) {
		this.listaPerfisFuncionalidade = listaPerfisFuncionalidade;
	}

	@SuppressWarnings("unchecked")
	public List<SelectItem> getListaFuncionalidades() {
		if (listaFuncionalidades == null) {
			listaFuncionalidades = new ArrayList<SelectItem>();
			listaFuncionalidades.add(new SelectItem(null,"Selecione"));
			List<Funcionalidade> lista = entityManager.createQuery("select f from Funcionalidade f where f.flgAtivo is true").getResultList();
			for(Funcionalidade f : lista){
				listaFuncionalidades.add(new SelectItem(f.getIdFuncionalidade(),f.getNome()));
			}
		}
		return listaFuncionalidades;
	}

	public void setListaFuncionalidades(List<SelectItem> listaFuncionalidades) {
		this.listaFuncionalidades = listaFuncionalidades;
	}
}
